package com.example.pattern.template;

/**
 * 抽象类：制作咖啡的模版
 *
 * @author FM_南风
 * @date 2024/7/3
 */
abstract class CoffeeTemplate {
    // 模版方法，定义咖啡的制作流程
    public final void makeCoffee() {
        boilWater();
        brewCoffeeGrinds();
        pourInCup();
        if (customerWantsCondiments()) {
            addCondiments();
        }
    }

    // 具体步骤的具体实现由子类提供
    abstract void brewCoffeeGrinds();
    abstract void addCondiments();

    // 公共步骤，具体实现是相同的
    void boilWater() {
        System.out.println("开水");
    }

    void pourInCup() {
        System.out.println("倒入杯中");
    }

    // 钩子方法，子类可以覆盖，控制算法的某些步骤
    boolean customerWantsCondiments() {
        return true;
    }
}
